/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compevol;

import java.util.Vector;

/**
 *
 * @author vureus
 */
public class Individuo implements Comparable<Individuo> {

    //cada individuo tem 3 ou 10 cromossomos (ou valores (x1, x2, x3, etc).
    public Vector<Cromossomo> cromossomos = new Vector<Cromossomo>();
   
    Configuracao config;


    public Individuo(Configuracao config) {
        this.config = config;
        
        //inicializa cromossomos:
        for (int i = 0; i < config.numValores; i++) {
            // random = [0,1)
            Cromossomo g = new Cromossomo(config.minValue, config.maxValue);
            cromossomos.add(g);
        }

    }
 

    public double[] valores() {
        double[] ret = new double[cromossomos.size()];
        for (int i = 0; i < cromossomos.size(); i++) {
            ret[i] = cromossomos.get(i).valor();
        }

        return ret;
    }

    public double avalia(){
        return config.funcao.avalia(this);
    }



    public void geraRandom() {
        //cromossomos = new Vector<Cromossomo>();
        cromossomos.clear();
        for (int i = 0; i < config.numValores; i++) {
            // random = [0,1)
            Cromossomo g = new Cromossomo(config.minValue, config.maxValue);
            g.geraRandom();
            cromossomos.add(g);
        }
    }


    public void mutacao() {
        //TODO:Algoritmo de mutacao
        for(Cromossomo c : cromossomos  ){
            for (int i = 0; i < c.genotipo.length; i++){
                if (Math.random() < 1.0/c.genotipo.length){
                    
                    c.genotipo[i] = !c.genotipo[i];
                }
            }
        }
    }

    @Override
    public String toString() {
        String retStr = "";
        /*for (Cromossomo cromo : cromossomos) {
            retStr += cromo.toString() + ": " + cromo.valor() + "\n";
        }*/

        retStr+=  this.avalia();
        return retStr;
    }


    public int compareTo(Individuo a) {
       //return either 1, 0, or -1
       //that you compare between this object and object a
        //return this.avalia() - a.avalia();
        if (this.avalia() == a.avalia()){
            return 0;
        }
        if (this.avalia() > a.avalia()){
            return 1;
        }
        return -1;
     }
}
